package com.aliang.jp.jp;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ScreenFrame extends MouseAdapter {

    public static boolean displayed = false;
    JFrame topFrame = new JFrame(); // 用来将整个活动屏幕覆盖掉，以实现对区域截图
    JPanel imagePanel; // 区域截屏时，用来显示整个屏幕的截图
    JPanel rectPanel; // 画出鼠标拖动时的选中区域及8个大小调整的小矩形
    final BufferedImage im;

    public ScreenFrame(final Robot robot, Dimension size) {

        topFrame.setBounds(0, 0, size.width, size.height);

        Rectangle rct = new Rectangle(0, 0, (int) size.getWidth(), (int) size.getHeight());

        // 处理延时抓屏，如果用户配置了延时时间，这里就先等会儿
        int delaytime = Settings.getInstance().getDelaytime();
        if (delaytime > 0) {
            try {
                Thread.sleep(delaytime * 1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(ScreenFrame.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        im = robot.createScreenCapture(rct);

        // 屏幕截图的面板，直接在初始化时覆写其paint方法
        imagePanel = new JPanel() {

            @Override
            public void paint(Graphics g) {
                // TODO Auto-generated method stub
                super.paint(g);
                g.drawImage(im, 0, 0, im.getWidth(), im.getHeight(), null);
            }
        };

        imagePanel.setSize(size);
        topFrame.add(imagePanel);

        // 绘制选择区的面板，一个选择区的矩形和8个小的方向调整矩形
        rectPanel = new JPanel() {

            @Override
            public void paint(Graphics g) {
                // TODO Auto-generated method stub
                super.paint(g);
                Rectangle rct = State.currentState.getSelectedRect();
                if (rct != null) {
                    Color oldColor = g.getColor();
                    // 下面的代码用来模拟非选中区的不可用状态，不过太吃CPU，不用了
//                    g.setColor(Color.LIGHT_GRAY);
//                    for (int i = 0; i < getWidth(); i += 4) {
//                        for (int j = 0; j < rct.y; j += 4) {
//                            g.fillOval(i, j, 2, 2);
//                            g.fillOval(i, j + rct.y + rct.height, 2, 2);
//                        }
//                    }
//
//                    for (int j = 0; j < rct.height; j += 4) {
//                        for (int i = 0; i < rct.x; i += 4) {
//                            g.fillOval(i, j + rct.y, 2, 2);
//                            g.fillOval(i + rct.x + rct.width, j + rct.y, 2, 2);
//                        }
//                    }
                    // 用绿色绘制出选中矩形
                    g.setColor(Color.GREEN);
                    g.drawRect(rct.x, rct.y, rct.width, rct.height);

                    // 用黑色绘制出8个方向调整矩形
                    g.setColor(Color.BLACK);
                    Rectangle[] corners = State.currentState.getCornerRects();
                    for (int i = 0; i < corners.length; i++) {
                        g.drawRect(corners[i].x, corners[i].y, corners[i].width, corners[i].height);
                    }
                    g.setColor(oldColor);
                }
            }
        };
        rectPanel.setOpaque(false);
        rectPanel.setSize(size);
        topFrame.getLayeredPane().add(rectPanel, new Integer(50));

        // 去掉Frame的装饰，变成一个没有边框的面板，用于全屏幕显示，这里也可以用JWindow
        topFrame.setUndecorated(true);

        topFrame.addMouseListener(this);

        topFrame.addMouseMotionListener(this);

        State.currentState.setStateParent(this);
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                topFrame.setVisible(true);
            }
        });
        
    }

    // 下面的代码是对不同鼠标动作的处理，不同的状态下有不同的处理方式。
    // 目前有两种状态：
    // 1、选择状态 －－ 用来处理鼠标拖动来选择抓取区域。
    // 2、修改状态 －－ 用来调来抓取区域的位置和大小。
    // 当前类只负责监听鼠标的动作，对于具体的鼠标动作的响应 委托 给当前状态来处理。
    // -------------------------------------------------------------------------
    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        State.currentState.mouseDragged(e);
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        State.currentState.mouseMoved(e);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        State.currentState.mousePressed(e);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        State.currentState.mouseClicked(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        State.currentState.mouseReleased(e);
    }
    // -------------------------------------------------------------------------
    
    void dispose() {
        displayed = false;
        topFrame.dispose();
        State.changeState(State.currentState, State.getSelectState());
    }
}
